查看原文
其他

使用相同的forkid防重放保护并不能阻止区块链分裂——深度解释BCH11月15日协议竞争

闪电 黄世亮 闪电HSL 2019-05-08

第0章 引言

BCH在11月15日的协议升级,因为出现相竞争的升级版本——bitcoin abc 0.18.2和bitcoin sv 0.1,所以会出现潜在的分裂。但SV的支持者一直强调这两个版本使用了相同的forkid,所以相互不带防重放保护,所以不会出分裂。这是错的,本文解释为什么。


第1章 什么是forkid

比特币(BTC和BCH)的每一笔交易都有一个签名,(也有不需要签名的啊,我们不管这些细节)。签名是这么一回事:有一个信息(mes),有一个公钥(pub),公钥对应一个私钥(pri)。签名就是使用私钥(pri)对信息(mes)使用特定算法来生成一个签名结果Sig(pri,mes)。验证签名就是别人使用算法带入签名结果sig和公钥pub进行验证ver(sig,pub)。验证的结果要么是正确,要么是错误。

通常每一笔比特币交易都有一个签名,以证明发送交易的人是有权限动用这笔币。这个签名就是使用发送者的私钥(pri),签名用的信息比较复杂,一般会交易版本,前置哈希,输出,金额……大约10项内容,我们记为mes。签名就是Sig(pri,mes)。我们把这个私钥和信息进行签名的过程称为签名算法。

当交易发出去之后,钱包,特别是挖矿节点会对这笔交易进行验证,其中就要对上述签名结果进行验证,要拿发送者的公钥(pub)和签名信息(mes)进行验证,ver(sig,pub),通过验证,则交易合法。

forkid就是针对签名信息进行做一些变更,以生成不同的签名算法。

签名算法不同,签名出来的结果肯定是不同的。

在区块链产生分裂时,如果两条链上的签名算法不同,则其中一条链签名出来的交易结果在另外一条链肯定是不合法的。这样就可以阻止用户在一条链上发交易,在另一条链被意外也发出去。这就是防重放保护(一会儿就介绍什么是交易重放)。

所以forkid的用法,就是在区块链发生潜在分裂之前,至少在其中一条链上改变交易的签名信息,从而改变签名算法,进而达到任意一条链的交易在另一条链上是不合法的。

 

第2章 什么是交易重放和重放保护

首先讲明白,重放攻击其实根本就不是攻击。目前币圈流传的各种关于重放攻击的言论有点过于危言耸听了。

重放攻击,这里的“攻击”根本就不是别人对你发起的某种侵略或偷盗行为。而是因为比特币区块链分裂后的两个分支链,都有相同的地址、私钥和交易格式。你在分裂点前的币,自动会被分裂后的两条链都承认。

如果区块链分裂后在任一条链上发起一笔交易,在两条链上这笔交易却都会有效。这就是显得你发了两笔交易,这里的另外一笔,就是“重放”。

我打个比方来解释这个,在国军退守台湾后,蒋公将大陆的很多机构都照样在台湾复制了一遍。比如在台湾也建了清华大学。而在大陆的北京,也是有一个清华大学。

如果你在美国给清华大学写一封信,就是用纸,让邮递员送的那种信。但收件地址上只写了“中国清华大学XXX收”

这个收件地址即可以解读为是北京的清华大学,也可以解读为台湾的清华大学。这下邮递员麻烦了,他干脆将你的信复印一遍,送到两个大学去。

这就是重放攻击。因为本来你只想寄给台湾的清华大学,但现在却被重放到了北京的清华大学。

所谓的重放保护,就是想办法让你发的交易,只在一条链上有效,在另一条链上无效。从而可以避免“重放”。

使用不同的forkid就是一种重放保护,不同的forkid可以让一笔交易只在一条链上合法,在另一条链上是非法的。这种方法需要开发者开发完整节点时部署不同的forkid,是非常彻底的重放保护做法。还有其他做法可以做到。

重放保护的做法非常很多。但本文不重点强调这个。我们回来forkid为什么无法避免区块链分裂。

 

第3章 区块链分裂

区块链分裂是因为矿工群体生产区块时,对什么是合法的区块的判断分成了不同的派别。只要是矿工无法对区块的合法性达成统一 共识,那区块链就处在分裂状态。

一波矿工(矿工群体1)发现了全网产生了一个新块后,就会下载并验证这个块,如果验证过后发生这是一个非法的块,那就会丢弃这个块,继续在原来的区块高度上挖矿。如果有另一波矿工(矿工群体2)认为这个新块是合法的块,那这一波矿工就会将算力切到这个块上做为新的区块高度上挖矿。这时矿工群体1和矿工群体2就产生了分裂,区块链也就会因此产生分裂。

区块链分裂是经常发生的,分裂有可能是因为网络延迟导致的,这一般是临时性的,比如在几秒内,也可能在一个区块的时间左右。因为对协议版本不同而导致的分裂,则时间往往要更长,也可能通过算力战达成统一意见,也可能长期分裂。

BCH在11月15日的协议升级过程,产生了两个相竞争的协议版本,bitcoin abc 0.18.2和bitcoin sv 0.1,这两个版本定义的区块合法性规则是不一样的。分别使用这两个软件进行挖矿的矿工一定会产生分裂,BCH区块链也一定会产生分裂。直到矿工全部统一到一个版本,分裂才会结束。从分裂到统一的过程,其中必然会有一波矿工将自己挖的所有区块,全部抛弃掉,这个代价是无比惨重的。

abc版本中定义的区块里的交易排序使用了规范交易排序(CTOR),而sv版本采用的是拓扑交易排序(TTOR)。我们不需要知道CTOR和TTOR的具体技术细节,我们只需要知道这是两种不相兼容的排序规范。挖CTOR区块的矿工必然不承认TTOR的区块,反之亦然。这就是为什么,只要在11月15日BCH矿工无法就采用abc还是sv版本达成统一意见,只要分裂成两个矿工群体,那BCH必然分裂。

这种区块链分裂和交易是否在两条链都合法是不相关的。

 

第4章 交易和区块

在区块链分裂时会出现相互不合法的区块,却可以打包相同的交易。

如果在区块链分裂后,两条链都采用相同的forkid,即交易的签名规则是相同的。因为是分裂产生的两条链,所以两条链都继承了原来那条链的所有UTXO。那如果采用相同的签名规则签署相同的UTXO,发出的交易,那就会同时在两条链上合法地存在。这就是交易重放。

到了这里,我们肯定知道了吧,相同的forkid根本无法阻止区块链分裂。

 

第5章11月15日BCH到底会不会分裂

只要在11月15日BCH矿工无法就采用abc还是sv版本达成统一意见,只要分裂成两个矿工群体,那BCH必然分裂。

分裂就是一条链分成了两条链,一个币分成了两个币。

至于这种分裂状态是不是临时的,大家说的算力战会对分裂状态产生什么样的影响,那都是分裂之后的事。

算力战有可能逼迫其中分裂后的一条链上的矿工全部放弃这条链,改成挖另一条链,如果实现了这样,那分裂状态就结束了,重新回到一条链。

如果算力战逼迫其中一条链改了算法,那就意味着这条链失去了所有的原来的矿工支持,矿工只能到另一条链上挖,这也是矿工对区块的合法性达成了统一意见。分裂状态也结束。但这种结束也会产生另外一个币和另外一条链,只是这条新链的矿工不同了。不过,改算法这事,发生的可能性比较低。

 

第6章 结束语

我希望这一次双方认真对待算力战,最好在有限时间内,打成共识,把分裂控制在临时性分裂状态,输了就认输。

 



今天卖脐橙




(欢迎加我微信号:HSL13116885 加入我的知识星球)







另请阅读:

重放攻击原理和防范措施——如何安全分离比特币(BTC)和比特现金(BCC)

比特币又要潜在分裂了,得知道重放攻击原理和防范措施了

算力战到底怎么打?——POW算力是如何决定协议升级的


上一篇:一种可监管的Token发行方案——区块链代币经济加速落地项目


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存